﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QS.ClassLibrary
{
    public struct IntVector3
    {
        // Zusammenfassung:
        //     Ruft die x-Komponente des Vektors ab oder legt sie fest.
        public int X;
        //
        // Zusammenfassung:
        //     Ruft die y-Komponente des Vektors ab oder legt sie fest.
        public int Y;
        //
        // Zusammenfassung:
        //     Ruft die z-Komponente des Vektors ab oder legt sie fest.
        public int Z;

        //
        // Zusammenfassung:
        //     Erstellt eine neue Instanz von Vector3.
        //
        // Parameter:
        //   value:
        //     Der Wert, auf den jede Komponente initialisiert werden soll.
        public IntVector3(int value)
        {
            X = Y = Z = value;
        }

        //
        // Zusammenfassung:
        //     Initialisiert eine neue Instanz von Vector3.
        //
        // Parameter:
        //   x:
        //     Der anfängliche Wert für die x-Komponente des Vektors.
        //
        //   y:
        //     Der anfängliche Wert für die y-Komponente des Vektors.
        //
        //   z:
        //     Der anfängliche Wert für die z-Komponente des Vektors.
        public IntVector3(int x, int y, int z)
        {
            X = x;
            Y = y;
            Z = z;
        }

        // Zusammenfassung:
        //     Gibt einen Vektor zurück, der in die entgegengesetzte Richtung zeigt.
        //
        // Parameter:
        //   value:
        //     Quellvektor.
        public static IntVector3 operator -(IntVector3 value)
        {
            return new IntVector3(-value.X, -value.Y, -value.Z);
        }
        //
        // Zusammenfassung:
        //     Subtrahiert einen Vektor von einem Vektor.
        //
        // Parameter:
        //   value1:
        //     Quellvektor.
        //
        //   value2:
        //     Quellvektor.
        public static IntVector3 operator -(IntVector3 value1, IntVector3 value2)
        {
            return new IntVector3(value1.X - value2.X, value1.Y - value2.Y, value1.Z - value2.Z);
        }
        //
        // Zusammenfassung:
        //     Testet Vektoren auf Ungleichheit.
        //
        // Parameter:
        //   value1:
        //     Der zu vergleichende Vektor.
        //
        //   value2:
        //     Der zu vergleichende Vektor.
        public static bool operator !=(IntVector3 value1, IntVector3 value2)
        {
            return value1.X != value2.X || value1.Y != value2.Y || value1.Z != value2.Z;
        }
        //
        // Zusammenfassung:
        //     Multipliziert einen Vektor mit einem skalaren Wert.
        //
        // Parameter:
        //   scaleFactor:
        //     Ein skalarer Wert.
        //
        //   value:
        //     Der Ausgangsvektor.
        public static IntVector3 operator *(int scaleFactor, IntVector3 value)
        {
            return new IntVector3(scaleFactor * value.X, scaleFactor * value.Y, scaleFactor * value.Z);
        }
        //
        // Zusammenfassung:
        //     Multipliziert einen Vektor mit einem skalaren Wert.
        //
        // Parameter:
        //   value:
        //     Der Ausgangsvektor.
        //
        //   scaleFactor:
        //     Ein skalarer Wert.
        public static IntVector3 operator *(IntVector3 value, int scaleFactor)
        {
            return new IntVector3(scaleFactor * value.X, scaleFactor * value.Y, scaleFactor * value.Z);
        }
        //
        // Zusammenfassung:
        //     Fügt zwei Vektoren hinzu.
        //
        // Parameter:
        //   value1:
        //     Der Ausgangsvektor.
        //
        //   value2:
        //     Der Ausgangsvektor.
        public static IntVector3 operator +(IntVector3 value1, IntVector3 value2)
        {
            return new IntVector3(value1.X + value2.X, value1.Y + value2.Y, value1.Z + value2.Z);
        }
        //
        // Zusammenfassung:
        //     Testet Vektoren auf Gleichheit.
        //
        // Parameter:
        //   value1:
        //     Der Ausgangsvektor.
        //
        //   value2:
        //     Der Ausgangsvektor.
        public static bool operator ==(IntVector3 value1, IntVector3 value2)
        {
            return value1.X == value2.X && value1.Y == value2.Y && value1.Z == value2.Z;
        }
    }
}
